#!/usr/bin/env bash
#
# Calculate the amount of space needed to run the kernel, including room for
# the .bss and .brk sections.
#
# Usage:
# objdump -h a.out | sh calc_run_size.sh

NUM='\([0-9a-fA-F]*[ \t]*\)'
OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"${NUM}${NUM}${NUM}${NUM}"'.*/\1\4/p')
if [ -z "$OUT" ]; then
  echo "Never found .bss or .brk file offset" >&2
  exit 1
fi

OUT=$(echo ${OUT# })
sizeA=$(printf "%d" 0x${OUT%% *})
OUT=${OUT#* }
offsetA=$(printf "%d" 0x${OUT%% *})
OUT=${OUT#* }
sizeB=$(printf "%d" 0x${OUT%% *})
OUT=${OUT#* }
offsetB=$(printf "%d" 0x${OUT%% *})

run_size=$((${offsetA} + ${sizeA} + ${sizeB}))

# BFD linker shows the same file offset in ELF.
if [ "${offsetA}" -ne "${offsetB}" ]; then
  # Gold linker shows them as consecutive.
  endB=$((${offsetB} + ${sizeB}))
  if [ "$endB" != "$run_size" ]; then
    printf "sizeA: 0x%x\n" ${sizeA} >&2
    printf "offsetA: 0x%x\n" ${offsetA} >&2
    printf "sizeB: 0x%x\n" ${sizeB} >&2
    printf "offsetB: 0x%x\n" ${offsetB} >&2
    echo ".bss and .brk are non-contiguous" >&2
    exit 1
  fi
fi

printf "%d\n" ${run_size}
exit 0
